home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #49 (Oct 89) / Driver Code / test_drvr.a < prev    next >
Text File  |  1988-01-11  |  13KB  |  576 lines

  1.                 TITLE            'Test of pump driver'
  2.                 Case            ON
  3.                 BLANKS            ON
  4.                 Machine            MC68020
  5.  
  6.                 PRINT            OFF
  7.                 INCLUDE         'Traps.a'
  8.                 INCLUDE         'ToolEqu.a'
  9.                 INCLUDE         'QuickEqu.a'
  10.                 INCLUDE         'SysEqu.a'
  11.                 INCLUDE         'SysErr.a'
  12.                 INCLUDE         'TimeEqu.a'
  13.                 INCLUDE         'Quickdraw.inc'
  14.                 INCLUDE         'PumpErrs.inc'
  15.                 LOAD            'ProgStrucMacs.d'
  16.                 LOAD            'FlowCtlMacs.d'
  17.                 PRINT            ON
  18.                 
  19. DgInfo            Record
  20. PumpAction        DS.W            1
  21. PumpRequest        DS.W            1
  22. PumpInfo        DS.W            1
  23. DCEntry            DS.L            1
  24. PumpDriverRef    DS.W            1
  25. DriverQueue        DS.L            1
  26.                 EndR
  27.                 
  28. ItemStuff        Record
  29. itemType        DS.W            1
  30. itemHdl            DS.L            1
  31. itemRect        DS.W            Rect
  32. itemHit            DS.W            1
  33. myEvent         DS.L            EventRecord     ; Current event info
  34. DialogPtr        DS.L            1
  35. Done            DS.W            1
  36.                 EndR
  37.  
  38.  
  39. theDialog        EQU         A3            ;Dialog pointer
  40. TestDLOG         EQU         128         ;Resource ID for the dialog
  41.  
  42. QuitButton            equ        2
  43. ActionButton        equ        1
  44. S_Button            equ        3
  45. R_Button            equ        4
  46. V_Button            equ        5
  47. I_Button            equ        6
  48. Num_Button            equ        7
  49. Ask_Button            equ        8
  50. Set_Button            equ        9
  51. In_Field            equ        10
  52. Out_Field            equ        11
  53.  
  54. ParamBlockSize        equ        108
  55.  
  56. ActionOffset        equ            csParam
  57. RequestOffset        equ            csParam+2
  58. InfoOffset            equ            csParam+4
  59.                 
  60. Ask                    equ        0
  61. Set                    equ        1
  62.  
  63. S_request            equ        0
  64. R_request            equ        1
  65. V_request            equ        2
  66. I_request            equ        3
  67. Num_request            equ        4
  68.  
  69. StatusAbnormal        equ        200
  70. RateReply            equ        201
  71. VolumeReply            equ        202
  72. InfusedReply        equ        203
  73. InvalidRequest        equ        204
  74. RdTmOut                equ        205
  75. WrTmOut                equ        206
  76. TooMany                equ        207
  77. UnDecode            equ        208
  78. UnkAction            equ        209
  79. UnkRequest            equ        210
  80. Misread                equ        211
  81. StatusSet            equ        212
  82. RateSet                equ        213
  83. VolumeSet            equ        214
  84. InfusedSet            equ        215
  85. PumpInitialized        equ        216
  86. BadProblem            equ        217
  87. StatusNormal        equ        218
  88. Exiting                equ        219
  89.  
  90.     Procedure    SetRequestButton
  91.  
  92.     Begin    Save=D3-D4,with=(ItemStuff);
  93.  
  94.             MOVE.W        D0,D4
  95.             For#    D3 = #S_Button To #Num_Button Do.S
  96.                 Call _GetDItem (theDialog:L,D3:W,itemType:A,itemHdl:A,itemRect:A)
  97.                 If# D3 EQ.W D4 Then.S
  98.                     Call _SetCtlValue ( itemHdl:L , #1:W )
  99.                 Else#.S
  100.                     Call _SetCtlValue ( itemHdl:L , #0:W )
  101.                 EndIf#
  102.             EndF#
  103.             MOVE.W        D4,D0
  104.             
  105.             Return
  106.             ENDP
  107.  
  108.         Procedure    SetActionButton
  109.  
  110.     Begin    Save=D3,with=(ItemStuff);
  111.  
  112.  
  113.             MOVE.W        D0,D3
  114.             If#    D3 EQ.W    #Ask_Button Then.S
  115.                 Call _GetDItem (theDialog:L,#Ask_Button:W,itemType:A,itemHdl:A,\
  116.                     itemRect:A)
  117.                 Call _SetCtlValue ( itemHdl:L , #1:W )                
  118.                 Call _GetDItem (theDialog:L,#Set_Button:W,itemType:A,itemHdl:A,\
  119.                     itemRect:A)
  120.                 Call _SetCtlValue ( itemHdl:L , #0:W )
  121.             ElseIf#.S    D3 EQ.W    #Set_Button     Then.S        
  122.                 Call _GetDItem (theDialog:L,#Set_Button:W,itemType:A,itemHdl:A,\
  123.                     itemRect:A)
  124.                 Call _SetCtlValue ( itemHdl:L , #1:W )
  125.                 Call _GetDItem (theDialog:L,#Ask_Button:W,itemType:A,itemHdl:A,\
  126.                     itemRect:A)
  127.                 Call _SetCtlValue ( itemHdl:L , #0:W )
  128.             EndIf#
  129.             MOVE.W        D3,D0
  130.             
  131.             Return
  132.             ENDP
  133.             
  134.     Procedure    HexDecode
  135.  
  136.     Begin    Save=D1-D3/A1,With=(DgInfo);
  137.  
  138.  
  139.                 CLR.W            D2
  140.                 MOVE.B            (A0)+,D3            ;Get the length byte
  141.                 EXT.W            D3
  142.                 EXT.L            D3
  143.                 SUBQ.L            #2,D3
  144.                 ADDQ.L            #1,A0                ;Toss the dollar sign
  145.                 For# D3 DownTo #0 Do.S
  146.                 
  147.                     MOVE.B            (A0)+,D1
  148.                     EXT.W            D1
  149.                     
  150.                     Switch#    D1
  151.                         Case#.S '0'..'9'
  152.                             SUB.B            #'0',D1
  153.                             Leave#.S
  154.                         Case#.S 'A'..'F'
  155.                             SUB.B            #'A'-10,D1
  156.                             Leave#.S
  157.                         Case#.S 'a'..'f'
  158.                             SUB.B            #'a'-10,D1
  159.                             Leave#.S
  160.                         Default#
  161.                             call    _SelIText ( theDialog:L , #In_Field:W , #0:W , #32767:W )
  162.                             call    _SysBeep ( #3:W )
  163.                             MOVE.W            #-1,D0
  164.                             Return
  165.                     EndS#
  166.                     
  167.  
  168. FoundIt                LSL.W            #4,D2
  169.                     ADD.W            D1,D2
  170.                 EndF#
  171.                 
  172.                 MOVE.W            D2,PumpInfo
  173.                 MOVE.W            #0,D0
  174.                 Return
  175.                 
  176.                 Return
  177.  
  178. ;                STRING            ASIS                
  179. ;Table1Base        DC.B            '0123456789ABCDEF'
  180.  
  181.                 ENDP
  182.  
  183.                 MACRO
  184.                 StringToNum
  185.                 MOVE.W            #1,-(SP)
  186.                 _Pack7
  187.                 ENDM
  188.  
  189.         Procedure    IntegerDecode
  190.  
  191.     Begin    Save=D1-D2,With=(DgInfo);
  192.  
  193.                 CLR.W            D1
  194.                 
  195.                 MOVE.B            (A0)+,D2            ;Get the length byte
  196.                 EXT.W            D2
  197.                 EXT.L            D2
  198.                 SUBQ.L            #1,D2
  199.                 For# D2 DownTo #0 Do.S
  200.  
  201.                     MOVE.B            (A0)+,D0
  202.                     SUB.B            #'0',D0
  203.                     If# MI OR D0 GT.B #9 Then.S
  204.                         GoTo#.S    Bad
  205.                     EndIf#
  206.                     EXT.W            D0
  207.                     MULU.W            #10,D1
  208.                     ADD.W            D0,D1
  209.                 EndF#
  210.                 
  211.                 MOVE.W            D1,PumpInfo
  212.                 MOVE.W            #0,D0
  213.                 Return
  214.                 
  215. Bad                call    _SelIText ( theDialog:L , #In_Field:W , #0:W , #32767:W )
  216.                 call    _SysBeep ( #3:W )
  217.                 MOVE.W            #-1,D0
  218.                 
  219.                 Return
  220.                 ENDP
  221.                 
  222.         Procedure    ActionProc
  223.  
  224.     Var        TempString:B[256];
  225.     Begin    Save=D0/A0-A1,With=(DgInfo,ItemStuff);
  226.  
  227.                 If# PumpAction EQ.W #Set Then.S
  228.                     Call _GetDItem (theDialog:L,#In_Field:W,itemType:A,itemHdl:A,\
  229.                         itemRect:A)
  230.                     Call _GetIText ( itemHdl:L , TempString(FP):A )
  231.                     LEA            TempString(FP),A0
  232.                     If#    (A0) EQ.B #0 OR (A0) EQ.W #$0124 Then.S            ;$0124 = Char(1)//'$'
  233.                         MOVE.W            #0,PumpInfo
  234.                     Else#.S
  235.                         If#    1(A0) EQ.B #'$' Then.S
  236.                             Call    HexDecode
  237.                         Else#.S
  238.                             Call    IntegerDecode
  239.                         EndIf#
  240.                         If#    D0 NE.W    #0    Then.S
  241.                             Return
  242.                         EndIf#
  243.                     EndIf#
  244.                 Else#.S
  245.                     MOVE.W            #0,PumpInfo
  246.                 EndIf#
  247.                     
  248. *
  249. * Set up the parameter block for the control call
  250. *
  251.  
  252.                 MOVE.L            #ParamBlockSize,D0
  253.                 _NewPtr ,clear
  254.                 MOVE.W            PumpDriverRef,ioRefNum(A0)
  255.                 MOVE.W            PumpAction,ActionOffset(A0)
  256.                 MOVE.W            PumpRequest,RequestOffset(A0)
  257.                 MOVE.W            PumpInfo,InfoOffset(A0)
  258.                 CLR.L            ioCompletion(A0)
  259.                 _Status ,async
  260.  
  261.                 If#    D0 NE.W    #0 Then.S                
  262.                     Call _GetDItem (theDialog:L,#Out_Field:W,itemType:A,itemHdl:A,\
  263.                             itemRect:A)
  264.                     Call _SetItext ( itemHdl:L , #'Driver unable to handle this call':A )
  265.                 EndIf#
  266.                 
  267.                 Return
  268.                 ENDP
  269.  
  270.         Procedure    EventProc ( The_message:L )
  271.  
  272.     Var        TempString:B[256];
  273.     Begin    Save=D0/A0-A2,With=(DgInfo,ItemStuff);
  274.  
  275.                 MACRO
  276.                 NumToString
  277.                 CLR.W            -(SP)
  278.                 _Pack7
  279.                 ENDM
  280.  
  281.                 MOVE.L            The_message(FP),A0
  282.  
  283. *  The message is a parameter block pointer for the just completed pump driver call. First,
  284. *  check to see that the request completed without an error state.
  285.  
  286.                 MOVE.W            ioResult(A0),D0
  287.                 If#    EQ    Then
  288.                     MOVE.L            A0,A2
  289.                     If#    ActionOffset(A0)    EQ.W    #Set    Then.S
  290.                         MOVE.W            RequestOffset(A0),D0
  291.                         Switch#    D0,JmpTbl=Y
  292.                             Case#.S    S_request
  293.                                 MOVE.W        #StatusSet,D3
  294.                                 Leave#.S
  295.                             Case#.S    R_request
  296.                                 MOVE.W        #RateSet,D3
  297.                                 Leave#.S
  298.                             Case#.S    V_request
  299.                                 MOVE.W        #VolumeSet,D3
  300.                                 Leave#.S
  301.                             Case#.S    I_request
  302.                                 MOVE.W        #InfusedSet,D3
  303.                                 Leave#.S
  304.                             Case#.S    Num_request
  305.                                 MOVE.W        #PumpInitialized,D3
  306.                                 Leave#.S
  307.                             Default#.S
  308.                                 MOVE.W        #BadProblem,D3
  309.                         EndS#
  310.                         Call    _GetString:L ( D3:W ),A0
  311.                         _HLock
  312.                         MOVE.L            (A0),A1
  313.                     Else#
  314.                         MOVE.W            RequestOffset(A0),D0
  315.                         Switch#    D0,JmpTbl=Y
  316.                             Case#.S    S_request
  317.                                 MOVE.W        InfoOffset(A2),D1
  318.                                 AND.W        #$000F,D1
  319.                                 If#    D1    EQ.W    #0    Then.S
  320.                                     MOVE.L        #StatusNormal,D3
  321.                                     Call    _GetString:L ( D3:W ),A0
  322.                                     _HLock
  323.                                     MOVE.L            (A0),A1
  324.                                 Else#.S
  325.                                     MOVE.L        #StatusAbnormal,D3
  326.                                     Call    _GetString:L ( D3:W ),A0
  327.                                     _HLock
  328.                                     MOVE.L            (A0),A1
  329.                                     CLR.W            D4
  330.                                     For#    D2    = #3    DownTo    #0    Do.S
  331.                                         BTST    D2,D1
  332.                                         If#    EQ    Then.S
  333.                                             LEA                #'AOIB',A0
  334.                                             MOVE.B            (A0,D2.W),21(A1,D4.W)
  335.                                             ADDQ.W            #1,D4
  336.                                         EndIf#
  337.                                     EndF#
  338.                                 EndIf#
  339.                                 GoTo#.S    StatusOut
  340.                             Case#.S    R_request
  341.                                 MOVE.L        #RateReply,D3
  342.                                 Leave#.S
  343.                             Case#.S    V_request
  344.                                 MOVE.L        #VolumeReply,D3
  345.                                 Leave#.S
  346.                             Case#.S    I_request
  347.                                 MOVE.L        #InfusedReply,D3
  348.                                 Leave#.S
  349.                             Case#.S    Num_request
  350.                                 MOVE.L        #InvalidRequest,D3
  351.                                 Call    _GetString:L ( D3:W ),A0
  352.                                 _HLock
  353.                                 MOVE.L            (A0),A1
  354.                                 GoTo#.S    StatusOut
  355.                             Default#.S
  356.                                 MOVE.L        #BadProblem,D3
  357.                         EndS#
  358.  
  359.                         Call    _GetString:L ( D3:W ),A0
  360.                         _HLock
  361.                         MOVE.L            (A0),A1
  362.                         MOVE.L            A1,-(SP)
  363.                         
  364.                         MOVE.W            InfoOffset(A2),D0
  365.                         EXT.L            D0
  366.                         LEA                TempString(FP),A0
  367.                         NumToString
  368.                         MOVE.B            (A0)+,D0
  369.                         MOVE.B            (A1),D1
  370.                         SUB.B            D0,D1
  371.                         EXT.W            D1
  372.                         EXT.W            D0
  373.                         EXT.L            D0
  374.                         LEA                (A1,D1.W),A1
  375.                         _BlockMove
  376.                         MOVE.L            (SP)+,A1
  377. StatusOut:
  378.                     EndIf#
  379.                 Else#
  380.                     MOVE.W            ioResult(A0),D0
  381.                     Switch#    D0
  382.                         Case#.S    statusErr
  383.                             MOVE.W            #Exiting,D3
  384.                             Leave#.S
  385.                         Case#.S    TimeOut+aRdCmd
  386.                             MOVE.L        #RdTmOut,D3
  387.                             Leave#.S
  388.                         Case#.S    TimeOut+aWrCmd
  389.                             MOVE.L        #WrTmOut,D3
  390.                             Leave#.S
  391.                         Case#.S    TooManyCharacters
  392.                             MOVE.L        #TooMany,D3
  393.                             Leave#.S
  394.                         Case#.S    PumpUndecodableNumber
  395.                             MOVE.L        #UnDecode,D3
  396.                             Leave#.S
  397.                         Case#.S    PumpUnknownAction
  398.                             MOVE.L        #UnkAction,D3
  399.                             Leave#.S
  400.                         Case#.S    PumpUnknownRequest
  401.                             MOVE.L        #UnkRequest,D3
  402.                             Leave#.S
  403.                         Case#.S    PumpMisread
  404.                             MOVE.L        #Misread,D3
  405.                             Leave#.S
  406.                         Default#.S
  407.                             MOVE.W        #BadProblem,D3
  408.                     EndS#
  409.  
  410.                     Call    _GetString:L ( D3:W ),A0
  411.                     _HLock
  412.                     MOVE.L            (A0),A1
  413.                     MOVE.L            A1,-(SP)
  414.                     
  415.                     MOVE.W            ioResult(A2),D0
  416.                     EXT.L            D0
  417.                     LEA                TempString(FP),A0
  418.                     NumToString
  419.                     MOVE.B            (A0)+,D0
  420.                     MOVE.B            (A1),D1
  421.                     SUB.B            D0,D1
  422.                     EXT.W            D1
  423.                     EXT.W            D0
  424.                     EXT.L            D0
  425.                     LEA                (A1,D1.W),A1
  426.                     _BlockMove
  427.                     MOVE.L            (SP)+,A1
  428.                     
  429.                 EndIf#
  430.                 MOVE.L            A2,A0
  431.                 _DisposPtr
  432.                 MOVE.L            A1,A2
  433.                 Call _GetDItem (theDialog:L,#Out_Field:W,itemType:A,itemHdl:A,\
  434.                         itemRect:A)
  435.                 Call _SetItext ( itemHdl:L , A2:L )
  436.                 
  437.                 Return
  438.                 ENDP
  439.                 
  440.         Procedure Test,MAIN=Y
  441.     Var        theID:W , theType:B[4] , theName:B[256];
  442.     Begin With=(QuickDraw,DgInfo,ItemStuff)
  443.                 
  444. *
  445. * Initialization
  446. *
  447.                 call _InitGraf (thePort:A)        ;Initialize QuickDraw
  448.                 call _InitFonts                    ;Initialize Font Manager
  449.                 MOVE.L            #$0000FFFF,D0    ;Discard any previous events
  450.                 _FlushEvents                    ;FlushEvents(EventEvent, 0);
  451.                 _InitWindows                     ;Initialize Window Manager
  452.                 _InitMenus                        ;Initialize Menu Manager
  453.                 _TEInit                         ;Initialize TextEdit
  454.                 call _InitDialogs (NIL)            ;Initialize Dialog Manager
  455.                 _InitCursor                     ;Make cursor an arrow
  456.  
  457.                 Call _GetNewDialog:L ( #TestDLOG , Nil , -1:A )
  458.                 
  459.                 MOVE.L            (A7),theDialog    ;theDialog holds ptr to dialog info
  460.                 _SetPort                        ;Set the current grafPort
  461.  
  462.                 MOVE.W            #S_Button,D0
  463.                 call            SetRequestButton
  464.                 MOVE.W            #Ask_Button,D0
  465.                 call            SetActionButton
  466.                 MOVE.W            #0,PumpRequest
  467.                 MOVE.W            #0,PumpAction
  468.                 MOVE.W            #0,PumpInfo
  469.                 CLR.W            Done
  470.  
  471.  
  472. *  Initialize the pump driver
  473.  
  474.                 String            Pascal
  475.                 LEA                #'.PumpDriver',A0
  476.                 MOVE.B            #0,1(A0)
  477.                 Call            _OpenDeskAcc:W ( A0:L ),PumpDriverRef
  478.                 
  479.                 MOVE.W            PumpDriverRef,D0
  480.                 ADD.W            #1,D0
  481.                 NEG                D0
  482.                 MOVE.L            UTableBase,A0
  483.                 MOVE.L            (A0,D0.W*4),A0
  484.                 MOVE.L            (A0),A0
  485.                 LEA                dCtlQHead(A0),A0
  486.                 MOVE.L            A0,DriverQueue
  487.  
  488. *
  489. * Main loop
  490. *
  491.  
  492. EventLoop    Repeat#
  493.                 If#    Done EQ.W    #-1 Then.s
  494.                     MOVE.L            DriverQueue,A0
  495.                     CMP.L            #0,(A0)
  496.                     If#    EQ    Then.S
  497.                         GoTo#    Quit
  498.                     EndIf#
  499.                 EndIf#
  500.                 Call _SystemTask                     ; Perform periodic actions defined for DAs
  501.                 Call _GetNextEvent:B(#everyEvent, myEvent:A),CC; ToolBox Event Mgr
  502.                 IF# NE THEN
  503.                     If#    myEvent.what EQ.W #app2Evt then.S
  504.                         call _SysBeep ( #2:W )
  505.                         call    EventProc ( myEvent.message:L )
  506.                         cycle#.S    EventLoop
  507.                     EndIf#
  508.                     Call _IsDialogEvent:B ( myEvent:A ),CC
  509.                     IF# EQ THEN.S
  510.                         Switch#.S myEvent.what
  511.                             Case#.S    nullEvt
  512.                                 leave#.S
  513.                             Default#
  514.                                 call _SysBeep ( #2:W )
  515.                         EndS#
  516.                     Else#
  517.                         Call _DialogSelect:B ( myEvent:A , DialogPtr:A , itemHit:A ),CC
  518.                         If#    NE Then
  519.                             MOVE.W        itemHit,D2
  520.                             Switch#.S    D2
  521.                                 Case#.S    QuitButton
  522.                                     For#    D3    = #V_request    DownTo    #S_request Do.S
  523.                                         MOVE.L            #ParamBlockSize,D0
  524.                                         _NewPtr ,clear
  525.                                         MOVE.W            PumpDriverRef,ioRefNum(A0)
  526.                                         MOVE.W            #Set,ActionOffset(A0)
  527.                                         MOVE.W            D3,RequestOffset(A0)
  528.                                         CLR.L            ioCompletion(A0)
  529.                                         CLR.W            InfoOffset(A0)
  530.                                         _Status ,async
  531.                                     EndF#
  532.  
  533.                                     MOVE.W            #-1,Done
  534.                                     MOVE.L            DriverQueue,A0
  535.                     
  536.                                     Leave#.S
  537.                                 Case#.S    ActionButton
  538.                                     call            ActionProc
  539.                                     Leave#.S
  540.                                 Case#.S    S_Button..Num_Button
  541.                                     MOVE.W            itemHit,D0
  542.                                     JSR                SetRequestButton
  543.                                     SUB.W            #S_Button,D0
  544.                                     MOVE.W            D0,PumpRequest
  545.                                     Leave#.S
  546.                                 Case#.S    Ask_Button,Set_Button
  547.                                     MOVE.W            itemHit,D0
  548.                                     JSR                SetActionButton
  549.                                     SUB.W            #Ask_Button,D0
  550.                                     MOVE.W            D0,PumpAction
  551.                                     Leave#.S
  552.                                 Default#
  553.                                     MOVE.W            #2,-(SP)
  554.                                     _SysBeep
  555.                             EndS#
  556.                         EndIf#
  557.                     EndIf#
  558.                 Else#.S
  559.                     Call _IsDialogEvent:B ( myEvent:A ),CC
  560.                     Call _DialogSelect:B ( myEvent:A , DialogPtr:A , itemHit:A ),CC
  561.                 EndIf#
  562.             Until#    False
  563.  
  564. *
  565. * User is now satisfied -- let's get out of here!
  566. *
  567. Quit:
  568.                 Call            _CloseDeskAcc ( PumpDriverRef:W )
  569.                 MOVE.L            A3,-(A7)
  570.                 _CloseDialog
  571.  
  572.                 Return
  573.                 ENDP
  574.                 
  575.                 END             ;                of Test
  576.